/-docs
/-editor
/-files
/-files-old
/-imports
/-layout
/-storage
/-storage/attached
/-storage/attached/api
DetectStorage.ts
LoadStorage.ts
LoadStorageRecipient.ts
UpdateStorage.ts
/-storage/attached/indexedDB
/-storage/attached/localStorage
/-storage/attached/webSQL
/-tests
/-typings
TypeScriptService.ts
functions.ts
ko.ts
persistence.api.ts
persistence.ts
shell.ts
teapo.html
teapo.js
teapo.ts
856
 
163
                'Persistent storage is not stable\n'+
164
                'indexedDB ' + errorIndexedDB + '\n' +
165
                'webSQL ' + errorWebSQL);
166
              return;
167
            }
168
169
            this._initWithStorage(load, forceLoadFromDom, pathElements);
170
          });
171
          return;
172
        }
173
        
174
        this._initWithStorage(load, forceLoadFromDom, pathElements);
175
      });
176
177
      var db = openDatabase(dbName, 1, null, 1024 * 1024 * 5);
178
179
      this._executeSql = (
180
        sqlStatement: string,
181
        args: any[],
182
        callback: (transaction: SQLTransaction, result: SQLResultSet) => void,
183
        errorCallback: (transaction: SQLTransaction, error: SQLError) => void) => {
184
185
        var errorCallbackSafe = (t: SQLTransaction, e: SQLError) => {
186
          alert(e + ' ' + e.message + '\n' + sqlStatement + '\n' + args);
187
          errorCallback(t, e);
188
        };
189
190
        db.transaction((t) => t.executeSql(sqlStatement, args, callback, errorCallbackSafe));
191
      };
192
      this._insertMetadataSql = 'INSERT INTO "*metadata" (name, value) VALUES(?,?)';
193
      this._updateMetadataSql = 'UPDATE "*metadata" SET value=? WHERE name=?';
194
195
      this._metadataProperties = {};
196
      this._loadTableListFromWebsql((tableList) => {
197
        this._initWithTableList(tableList, forceLoadFromDom, pathElements);
198
      });
199
    }
200
201
    private _initWithStorage(load: teapo.storage.attached.LoadStorage, forceLoadFromDom: boolean, pathElements: { [name: string]: HTMLScriptElement; }) {
202
      var domEdited = this._metadataElement ?
203
        safeParseInt(this._metadataElement.getAttribute('edited')) :
204
        null;
205
206
      if (domEdited || 0 < load.editedUTC || 0) {
207
        console.log('DOM is younger, need to call load.load', domEdited, load.editedUTC);
208
      }
209
      else {
210
        console.log('DOM is older, need to call load.migrate', domEdited, load.editedUTC);
211
        var filesByName: { [fullPath: string]: { [propertyName: string]: string; }; } = { };
212
        for (var fullPath in pathElements) if (pathElements.hasOwnProperty(fullPath)) {
213
          var properties: any = {};
214
          loadPropertyBagFromDom(pathElements[fullPath], properties);
215
          filesByName[fullPath] = properties;
216
        }
217
218
        load.migrate(
219
          domEdited || new Date().valueOf(),
220
          filesByName,
221
          (error, updater) => {
222
            console.log('migrate completed: ', error, updater, filesByName);
223
          });
224
      }
225
    }
226
227
    private _initWithTableList(tableList: string[], forceLoadFromDom: boolean, pathElements: { [name: string]: HTMLScriptElement; }) { 
228
      var metadataTableExists = false;
229
      for (var i = 0; i < tableList.length; i++) {
230
        if (tableList[i] === '*metadata') {
231
          metadataTableExists = true;
232
          break;
233
        }
234
      }
235
      if (!metadataTableExists || forceLoadFromDom) {
236
        this._loadInitialStateFromDom(pathElements);
237
        return;
238
      }
239
240
      var domEdited = this._metadataElement ?
221:74 local var { [fullPath: string]: { [propertyName: string]: string; }; } log(message?: any, ...optionalParams: any[]): void